home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue32 / survive / demo1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-02-23  |  6.5 KB  |  252 lines

  1. unit demo1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   SQLOLE_TLB, StdCtrls, ActiveX;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     edtServerName: TEdit;
  12.     Label1: TLabel;
  13.     edtUsername: TEdit;
  14.     edtPassword: TEdit;
  15.     Label2: TLabel;
  16.     Label3: TLabel;
  17.     btnConnect: TButton;
  18.     memResults: TMemo;
  19.     lstDatabaseNames: TListBox;
  20.     Label4: TLabel;
  21.     lstTableNames: TListBox;
  22.     Label5: TLabel;
  23.     lstColumnNames: TListBox;
  24.     Label6: TLabel;
  25.     memQuery: TMemo;
  26.     Label7: TLabel;
  27.     Label8: TLabel;
  28.     btnExecSQL: TButton;
  29.     btnOpenSQL: TButton;
  30.     Button3: TButton;
  31.     procedure FormCreate(Sender: TObject);
  32.     procedure FormDestroy(Sender: TObject);
  33.     procedure btnConnectClick(Sender: TObject);
  34.     procedure lstDatabaseNamesClick(Sender: TObject);
  35.     procedure lstTableNamesClick(Sender: TObject);
  36.     procedure btnExecSQLClick(Sender: TObject);
  37.     procedure btnOpenSQLClick(Sender: TObject);
  38.   private
  39.   protected
  40.     function GetCurrentDatabase: Database;
  41.     function GetCurrentDatabaseIndex: Integer;
  42.     function GetCurrentTable: Table;
  43.     function GetCurrentTableIndex: Integer;
  44.   public
  45.     Server: SQLServer;
  46.     property CurrentDatabase: Database read GetCurrentDatabase;
  47.     property CurrentDatabaseIndex: Integer read GetCurrentDatabaseIndex;
  48.     property CurrentTable: Table read GetCurrentTable;
  49.     property CurrentTableIndex: Integer read GetCurrentTableIndex;
  50.   end;
  51.  
  52. var
  53.   Form1: TForm1;
  54.  
  55. implementation
  56.  
  57. {$R *.DFM}
  58.  
  59. function PadStr(aStr: string; aWidth: Integer): string;
  60. var
  61.   L: Integer;
  62. begin
  63.   L := Length(aStr);
  64.   if L >= aWidth then
  65.     Result := Copy(aStr, 1, aWidth)
  66.   else
  67.     Result := aStr + StringOfChar(' ', aWidth - L);
  68. end;
  69.  
  70. function TForm1.GetCurrentDatabase: Database;
  71. begin
  72.   Result := Server.Databases.Item(CurrentDatabaseIndex);
  73. end;
  74.  
  75. function TForm1.GetCurrentDatabaseIndex: Integer;
  76. begin
  77.   Result := lstDatabaseNames.ItemIndex + 1;
  78. end;
  79.  
  80. function TForm1.GetCurrentTable: Table;
  81. begin
  82.   Result := CurrentDatabase.Tables.Item(CurrentTableIndex);
  83. end;
  84.  
  85. function TForm1.GetCurrentTableIndex: Integer;
  86. begin
  87.   Result := lstTableNames.ItemIndex + 1;
  88. end;
  89.  
  90. procedure TForm1.FormCreate(Sender: TObject);
  91. var
  92.   I: Integer;
  93. begin
  94.   Server := CoSQLServer.Create;
  95.   with Server.Application.Properties do
  96.     For I := 1 to Count do
  97.       With Item(I) do
  98.         memResults.Lines.Add (Format ('%s=%s', [Name, Value]));
  99. end;
  100.  
  101. procedure TForm1.FormDestroy(Sender: TObject);
  102. begin
  103.   Server := nil;
  104. end;
  105.  
  106. procedure TForm1.btnConnectClick(Sender: TObject);
  107. var
  108.   I: Integer;
  109. begin
  110.   if btnConnect.Caption = 'Disconnect' then
  111.   begin
  112.     Server.Disconnect;
  113.     lstDatabaseNames.Items.Clear;
  114.     lstTableNames.Clear;
  115.     lstColumnNames.Clear;
  116.     btnConnect.Caption := 'Connect';
  117.   end
  118.   else
  119.   begin
  120.     Server.Connect(edtServerName.Text, edtUserName.Text, edtPassword.Text);
  121.     for I := 1 to Server.Databases.Count do
  122.       lstDatabaseNames.Items.Add(Server.Databases.Item(I).Name);
  123.     btnConnect.Caption := 'Disconnect';
  124.   end;
  125. end;
  126.  
  127. procedure TForm1.lstDatabaseNamesClick(Sender: TObject);
  128. var
  129.   I: Integer;
  130. begin
  131.   with lstTableNames.Items do
  132.   begin
  133.     Clear;
  134.     lstColumnNames.Clear;
  135.     BeginUpdate;
  136.     Screen.Cursor := crHourglass;
  137.     try
  138.       with CurrentDatabase.Tables do
  139.         for I := 1 to Count do
  140.           lstTableNames.Items.Add(Item(I).Name);
  141.     finally
  142.       EndUpdate;
  143.       Screen.Cursor := crDefault;
  144.     end;
  145.   end;
  146. end;
  147.  
  148. procedure TForm1.lstTableNamesClick(Sender: TObject);
  149. var
  150.   I: Integer;
  151. begin
  152.   with lstColumnNames.Items do
  153.   begin
  154.     Clear;
  155.     BeginUpdate;
  156.     Screen.Cursor := crHourglass;
  157.     try
  158.       with CurrentTable.Columns do
  159.         for I := 1 to Count do
  160.           lstColumnNames.Items.Add(Item(I).Name);
  161.     finally
  162.       EndUpdate;
  163.       Screen.Cursor := crDefault;
  164.     end;
  165.   end;
  166. end;
  167.  
  168. procedure TForm1.btnExecSQLClick(Sender: TObject);
  169. begin
  170.   CurrentDatabase.ExecuteImmediate(memQuery.Text, SQLOLEExec_Default);
  171. end;
  172.  
  173. procedure TForm1.btnOpenSQLClick(Sender: TObject);
  174. var
  175.   I: Integer;
  176.   Row, Col, SetNum : Integer;
  177.   S: string;
  178.   ColWidth: Integer;
  179. begin
  180.   Screen.Cursor := crHourglass;
  181.   try
  182.     ColWidth := 20;
  183.     with CurrentDatabase.ExecuteWithResults(memQuery.Text) do
  184.     begin
  185.       memResults.Lines.Add('');
  186.       memResults.Lines.Add('Query Result Set Properties:');
  187.       if (ResultSets = 0) then
  188.         Exit;
  189.  
  190.       with Properties do
  191.         for I := 1 to Count do
  192.           with Item(I) do
  193.             memResults.Lines.Add (Format ('***%s=%s', [Name, Value]));
  194.  
  195.       for SetNum := 1 to ResultSets do
  196.       begin
  197.         CurrentResultSet := SetNum;
  198.  
  199.         with Properties do
  200.           for I := 1 to Count do
  201.             with Item(I) do
  202.               memResults.Lines.Add (Format ('***%s=%s', [Name, Value]));
  203.  
  204.  
  205.         { echo the column names }
  206.         S := '';
  207.         for Col := 1 to Columns do
  208.           S := S + PadStr(ColumnName[Col], ColWidth);
  209.         memResults.Lines.Add(S);
  210.  
  211.         for Row := 1 to Rows do
  212.         begin
  213.           S := '';
  214.           for Col := 1 to Columns do
  215.             case ColumnType[Col] of
  216.               SQLOLE_DTypeChar,
  217.               SQLOLE_DTypeVarchar,
  218.               SQLOLE_DTypeText,
  219.               SQLOLE_DTypeDateTime,
  220.               SQLOLE_DTypeDateTime4:
  221.                 S := S + PadStr(GetColumnString(Row, Col), ColWidth);
  222.               SQLOLE_DTypeInt1,
  223.               SQLOLE_DTypeInt2,
  224.               SQLOLE_DTypeInt4:
  225.                 S := S + PadStr(IntToStr(GetColumnLong(Row, Col)), ColWidth);
  226.               SQLOLE_DTypeFloat4,
  227.               SQLOLE_DTypeMoney4:
  228.                 S := S + PadStr(FloatToStr(GetColumnFloat(Row, Col)), ColWidth);
  229.               SQLOLE_DTypeFloat8,
  230.               SQLOLE_DTypeMoney:
  231.                 S := S + PadStr(FloatToStr(GetColumnDouble(Row, Col)), ColWidth);
  232.               SQLOLE_DTypeImage:
  233.                 S := S + PadStr('(image)', ColWidth);
  234.               SQLOLE_DTypeVarBinary,
  235.               SQLOLE_DTypeBinary:
  236.                 S := S + PadStr('(binary)', ColWidth);
  237.               SQLOLE_DTypeBit:
  238.                 S := S + PadStr(IntToStr(Ord(GetColumnBool(Row, Col))), ColWidth);
  239.               else
  240.                 S := S + PadStr('(xxxxx)', ColWidth);
  241.             end;
  242.           memResults.Lines.Add(S);
  243.         end;
  244.       end;
  245.     end;
  246.   finally
  247.     Screen.Cursor := crDefault;
  248.   end;
  249. end;
  250.  
  251. end.
  252.